﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2022   保留所有权利。
 * CLR版本：4.0.30319.42000
 * 机器名称：DESKTOP-UL84BU5
 * 公司名称：
 * 命名空间：KingerRobot.WanliWMS.SpiService.Services.Equip
 * 唯一标识：fa9eb938-bd3e-4547-8fe3-a9a3db999249
 * 文件名：BEquipManageImpl
 * 当前用户域：DESKTOP-UL84BU5
 * 
 * 创建者：zzl
 * 电子邮箱：1003590782@qq.com
 * 创建时间：2022/7/4 16:28:13
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using KingerRobot.MexicoSailunMDC.Dao;
using KingerRobot.MexicoSailunWMS.Spi;
using KingerRobot.MexicoSailunWMS.SpiService.Services;

namespace KingerRobot.MexicoSailunWMS.SpiService;
//WMS.Equip
public class BEquipManageImpl : IEquipManageService
{
    private readonly static IRcsEquip _RcsEquip = new BRcsEquip();
    private readonly static ITaskCmd _TaskCmd = new BTaskCmd();
    private readonly static ITask _Task = new BTask();
    private readonly static IRcsEquipCrn _RcsEquipCrn = new BRcsEquipCrn();
    private readonly static IRcsEquipCuring _RcsEquipCur = new BRcsEquipCuring();
    private readonly static ICodeEquipType _WmsEquipType = new BCodeEquipType();
    private readonly static IWmsEquipErrs _WmsEquipErrs = new BWmsEquipErrs();
    private readonly static IWcsAsrsCrnAbnormalInput _WcsAsrsCrnAbnormalInput = new BWcsAsrsCrnAbnormalInput();
    private readonly static IRcsLocation _RcsLocation = new BRcsLocation();
    private readonly static IWmsOutOrderSummary _WmsOutOrderSummary = new BWmsOutOrderSummary();
    private readonly static IWmsOutOrderMaster _WmsOutOrderMaster = new BWmsOutOrderMaster();
    public List<EquipManageBean> GetEquipBeans(EquipManagePara equipManagePara)
    {
        var equips = _RcsEquip.GetEquips();
        var types = _WmsEquipType.GetWmsEquipTypes();
        var result = equips.Join(types, f => f.EquipType, s => s.Id, (f, s) => new
        {
            Equip = f,
            Type = s,
        }).ToList();

        if (!string.IsNullOrWhiteSpace(equipManagePara?.EquipName))
        {
            result = result.Where(t => t.Equip.EquipName.Contains(equipManagePara.EquipName)).ToList();
        }

        if (equipManagePara is not null && equipManagePara.TypeId is not null && equipManagePara.TypeId != 0)
        {
            result = result.Where(t => t.Type.Id == equipManagePara.TypeId).ToList();
        }
        if (!string.IsNullOrWhiteSpace(equipManagePara?.EquipEnable) && Convert.ToInt32(equipManagePara?.EquipEnable.Trim()) >= 0)//硫化机是否可用
        {
            result = result.Where(t => t.Equip.EquipEnable == Convert.ToInt32(equipManagePara?.EquipEnable.Trim())).ToList();
        }


        return result.Select(t => new EquipManageBean
        {
            Id = t.Equip.Id.GetValueOrDefault(),
            Code = t.Equip.EquipCode,
            Name = t.Equip.EquipName,
            TypeName = t.Type.TypeName,
            Status = t.Equip.EquipEnable == 1 ? "可用" : "不可用",
            IsStatus = t.Equip.EquipEnable == 1 ? true : false,
            ErrCode = t.Equip.ErrCode,
            ErrMsg = t.Equip.ErrMsg,
        }).ToList();
    }

    public List<EquipErrBean> GetEquipErrHistoryBeans(EquipErrPara equipErrPara)
    {
        var result = _WmsEquipErrs.GetEquipErrsV2(equipErrPara);
        if (!string.IsNullOrWhiteSpace(equipErrPara?.Name))
        {
            result = result.Where(t => t.Name.Contains(equipErrPara.Name)).ToList();
        }

        return result;
    }
    public List<EquipErrBean> GetEquipNoFinishErrBeans()
    {
        var result = _WmsEquipErrs.GetEquipNoFinishErrBeans();
        return result;
    }

    public List<EquipStatusBean> GetEquipStatusBeans(EquipStatusPara equipStatusPara)
    {
        var equips = _RcsEquip.GetEquips();
        var taskCmds = _TaskCmd.GetTaskCmds();

        var result = equips.Join(taskCmds, f => f.Id, s => s.EquipId, (f, s) => new
        {
            Equip = f,
            TaskCmd = s,
        }).Select(t => new EquipStatusBean
        {
            Id = t.Equip.Id.GetValueOrDefault(),
            Code = t.Equip.EquipCode,
            Name = t.Equip.EquipName,
            Status = t.Equip.EquipEnable == 1 ? "可用" : "不可用",
            ErrCode = t.Equip.ErrCode,
            IsErrCode = t.Equip.ErrCode > 0 ? "是" : "否",
            ErrMsg = t.Equip.ErrMsg,
            TaskNo = t.TaskCmd.TaskNo.GetValueOrDefault(),
            TaskStatusName = t.TaskCmd.CmdStatus == 0 ? "创建" : t.TaskCmd.CmdStatus == 1 ? "可下发" : "已下发",
        }).ToList();

        if (!string.IsNullOrWhiteSpace(equipStatusPara?.Name))
        {
            result = result.Where(t => t.Name.Contains(equipStatusPara.Name)).ToList();
        }
        if ((equipStatusPara?.TaskNo ?? 0) != 0)
        {
            result = result.Where(t => t.TaskNo == equipStatusPara.TaskNo).ToList();
        }

        return result;
    }

    public List<EquipTypeBean> GetEquipTypeBeans()
    {
        var result = _WmsEquipType.GetWmsEquipTypes();

        return result.Select(t => new EquipTypeBean
        {
            Id = t.Id.GetValueOrDefault(),
            Name = t.TypeName,
        }).ToList();
    }

    [OperationLog("设备可用性启用禁用")]
    public int UpdateEquipEnable(Spi.UpdateEquipPara updateEquipPara, long userId, string userName, string clientHost)
    {
        var result = _RcsEquip.UpdateEquipEnable(updateEquipPara?.Id ?? 0);
        return result;
    }

    public List<EquipBean> GetCrnEquipBeans()
    {

        var equipCrnIds = _RcsEquipCrn.GetRcsEquipCrn().Select(t => t.Id).ToList();
        var equips = _RcsEquip.GetEquips();
        var result = equipCrnIds.Join(equips, f => f, s => s.Id, (f, s) => new EquipBean
        {
            Id = s.Id ?? 0,
            Name = s.EquipName
        }).OrderBy(t => t.Id).ToList();
        return result;

        //var result = new List<EquipBean>();
        //result = _RcsEquip.GetEquips().Where(t => equipCrnIds.Contains(t.Id)).Select(t => new EquipBean
        //{
        //    Id = t.Id.GetValueOrDefault(),
        //    Name = t.EquipName
        //}).OrderBy(t => t.Id).ToList();

    }
    public List<EquipBean> GetCurEquipBeans()

    {
        var result = new List<EquipBean>();
        var equipCrnIds = _RcsEquipCur.GetEquipCurings().Select(t => t.Id).ToList();
        result = _RcsEquip.GetEquips().Where(t => equipCrnIds.Contains(t.Id)).Select(t => new EquipBean
        {
            Id = t.Id.GetValueOrDefault(),
            Name = t.EquipName,
            Code = t.EquipCode,
        }).ToList();
        return result;
    }


    public List<EquipBean> GetCurEquipCodeBeans()

    {
        var result = new List<EquipBean>();
        var equipCrnIds = _RcsEquipCur.GetAllEquipCurings().Select(t => t.Id).ToList();
        result = _RcsEquip.GetEquips().Where(t => equipCrnIds.Contains(t.Id)).Select(t => new EquipBean
        {
            Code = t.EquipCode,
        }).Distinct().ToList();
        List<EquipBean> list = new List<EquipBean>();
        foreach (var item in result)
        {
            if (!list.Contains(item))
            {
                list.Add(item);
            }
        }
        return list.OrderBy(t => t.Code).ToList();
    }

    public List<EquipNetWorkStatusBean> GetEquipNetWorkStatusBeans(EquipNetWorkStatusPram equipNetWorkStatusPram)
    {
        var result = new List<EquipNetWorkStatusBean>();
        var equipStatus = _RcsEquip.GetAllEquipStatues().Where(t => t.UseFlag == 1).ToList();
        // var equips = _RcsEquip.GetEquips().ToList();
        // result = equipStatus.Join(equips, f => f.Id, s => s.Id, (f, s) => new EquipNetWorkStatusBean
        // {
        //    EquipCode = s.EquipCode,
        //    EquipName = s.EquipName,
        //    EquipIP = f.Ip,
        //    NetWorkStatus = f.Status == 0 ? "网络不通" : "网络正常"
        // }).ToList();
        result = equipStatus.Select(t => new EquipNetWorkStatusBean
        {
            Tips = t.Tips,
            EquipName = t.Remark,
            EquipIP = t.Ip,
            NetWorkStatus = (t.Status == 1 ? "网络正常" : (t.Status == 2 ? "网络超时" : $"网络不通{t.Status}")),
            Status = t.Status.GetValueOrDefault()
        }).ToList();
        if (!string.IsNullOrWhiteSpace(equipNetWorkStatusPram.equipName))
        {
            result = result.Where(t => t.EquipName.Contains(equipNetWorkStatusPram.equipName)).ToList();
        }
        if (!string.IsNullOrWhiteSpace(equipNetWorkStatusPram.equipIP))
        {
            result = result.Where(t => t.EquipIP.Contains(equipNetWorkStatusPram.equipIP)).ToList();
        }
        return result.OrderBy(t => t.NetWorkStatus).ToList();
    }

    public LocEnableBean GetLocEnableByCrnId(long crnId)
    {
        var wcsAsrsCrnAbnormalInput = _WcsAsrsCrnAbnormalInput.GetAsrsCrnAbnormalInPutByCrnId(crnId);
        if (wcsAsrsCrnAbnormalInput is null)
        {
            return new();
        }

        var loc1 = wcsAsrsCrnAbnormalInput.InputLoc1.GetValueOrDefault();
        var loc2 = wcsAsrsCrnAbnormalInput.InputLoc2.GetValueOrDefault();

        var locations = _RcsLocation.GetLocationsByLocIds(new() { loc1, loc2 });
        return new()
        {
            LocEnable1 = locations.Where(t => t.Id == loc1).Any() ? 1 : 0,
            LocEnable2 = locations.Where(t => t.Id == loc2).Any() ? 1 : 0,
        };
    }

    public int DeleteCrnOutOrder(long equipId)
    {

        var taskList = new List<POWcsTask>();

        var summaryList = _WmsOutOrderSummary.GetOutOrderSummaryByCrnId(equipId, ref taskList);

        var result = 0;
        foreach (var task in taskList)
        {

            result = _Task.BakAndDeleteTaskAndCmd(task.Id ?? 0);
            if (result > 0)
            {
                var summary = summaryList.Where(t => t.Id == task.SummaryId).FirstOrDefault();
                _WmsOutOrderMaster.BakAndDeleteOutOrderBySummaryId(summary.MaterialId ?? 0, summary.Id ?? 0);
            }
        }


        return result;
    }
}
